/**
 * 数据库配置文件
 * 使用 TypeORM 创建数据库连接
 */
import { DataSource } from "typeorm"
import * as mysql from 'mysql2/promise'
import path from "path";
import { User } from "@/entities/system/user.entity";
import * as CryptoJS from 'crypto-js';

/** 数据库名称 */
const DB_NAME = 'da_sheng_fu_fa';

/** 数据库密码 */
const DB_PASSWORD = '~gMN1)y@#xX3>8!uV]id';
// const DB_PASSWORD = 'root';

// 创建数据库连接并初始化
async function initializeDatabase() {
    try {
        // 先创建一个没有指定数据库的连接
        const connection = await mysql.createConnection({
            host: "localhost",
            port: 3306,
            user: "root",
            password: DB_PASSWORD
        });

        // 创建数据库
        await connection.query(`CREATE DATABASE IF NOT EXISTS ${DB_NAME}`);
        await connection.end();

        console.log('数据库创建成功');
        return true;
    } catch (error) {
        console.error('初始化数据库失败:', error);
        return false;
    }
}

// 获取命令行参数
const args = process.argv.slice(2);
const shouldSync = args.includes('--sync-db');
console.log('args', process.argv);

export const AppDataSource = new DataSource({
    // 数据库类型
    type: "mysql",
    // 数据库主机地址
    host: "localhost", // Docker 容器对外暴露的主机地址
    // 数据库端口号
    port: 3306,       // Docker 容器对外暴露的端口
    // 数据库用户名
    username: "root",
    // 数据库密码
    password: DB_PASSWORD, // 与 MYSQL_ROOT_PASSWORD 环境变量匹配
    // 数据库名称
    database: DB_NAME,
    // 是否自动同步实体到数据库结构
    synchronize: shouldSync,
    // 是否启用日志记录
    logging: true,
    // 实体文件路径配置，扫描 src/entities 目录下所有 .ts 文件
    entities: [path.join(__dirname, "..", "entities", '**', "*.{ts,js}")],
    // 订阅者配置，暂未使用
    subscribers: [],
    // 数据库迁移配
    migrations: [],
    // 连接池配置
    extra: {
        connectionLimit: 10, // 连接池大小
        charset: 'utf8mb4', // 字符集配置
        authPlugins: {
            mysql_clear_password: () => () => Buffer.from([0x00])
        }
    }
});

// 导出初始化函数
export const initialize = async () => {
    try {
        await initializeDatabase();
        await AppDataSource.initialize();
        shouldSync && await ensureSuperAdmin();
        console.log("数据库连接成功");
        console.log(`数据库同步状态: ${shouldSync ? '启用' : '禁用'}`);
        return true;
    } catch (error) {
        console.error("数据库连接失败:", error);
        return false;
    }
};

/** 如果没有超级管理员，就添加一个 */
async function ensureSuperAdmin() {
    const userRepository = AppDataSource.getRepository(User);
    const superAdmin = await userRepository.findOne({ where: { username: 'admin' } });

    if (!superAdmin) {
        const newUser = userRepository.create({
            username: 'admin',
            password: CryptoJS.MD5('admin123').toString(), // 对默认密码进行加密
            nickname: '超级管理员'
        });
        await userRepository.save(newUser);
        console.log('超级管理员已创建');
    } else {
        console.log('超级管理员已存在');
    }
}
